<!DOCTYPE html>
<!--
     Any copyright is dedicated to the Public Domain.
     http://creativecommons.org/publicdomain/zero/1.0/
-->
<html class="reftest-wait" lang="en-US">
  <head>
  <meta charset="utf-8">
  <title>CSS Test: CSS display:contents; in Shadow DOM</title>
  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=907396">
  <link rel="help" href="https://drafts.csswg.org/css-display/">
  <link rel="match" href="display-contents-shadow-dom-1-ref.html">
<style>
html,body {
  color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
}
.before::before, ::slotted(.before)::before {content: "a ";}
.after::after, ::slotted(.after)::after {content: " c";}
div.before::before {content: "X ";}
div.after::after {content: " Y";}
.b, .c, ::slotted(.b), ::slotted(.c) { display:contents; }
</style>
  </head>
  <body>
    <div id="host1" class="before"></div>
    <span id="host2"></span>
    <div id="host3" class="after"></div>
    <div id="host4" class="before after"></div>
    <div id="host5" class="after"></div>
    <div id="host6" class="before"></div>
    <div id="host7"></div>
    <div id="host8" class="after"></div>
    <div id="host9" class="before after"></div>
    <div id="hostA" class="after"></div>
    <div id="hostB"></div>
    <div id="hostC"></div>
    <div id="hostD"></div>
    <div id="hostE"></div>
    <div id="hostF" class="before"></div>
    <div id="hostG"></div>
    <span id="hostH"></span>
    <div id="hostI"></div>
    <div id="hostJ"></div>
    <span id="hostK"></span>
    <div id="hostL"></div>
    <div id="hostM"><i slot=i>Two</i><b slot=b>One</b></div>
    <div id="hostN"><i slot=i class="c">Two</i><b slot=b>One</b></div>
    <div id="hostO"><i slot=i>Two</i><b slot=b class="c">One</b></div>
    <div id="hostP"><i slot=i class="c">Two</i><b slot=b class="c">One</b></div>
    <div id="hostQ" class="c" style="color:blue"><i slot=i class="c">Two</i><b slot=b class="c">One</b></div>Three
    <div id="hostS" class="c"><span class="c">S</span></div>
    <div id="hostT" class="c">T</div>
    <div id="hostU"><span slot="c">U</span></div>
    <div id="hostV" class="c" style="color:red"><b slot="b" class="c" style="color:inherit">V</b></div>

   <script>
      function shadow(id) {
        return document.getElementById(id).attachShadow({mode:"open"});
      }
      function span(s) {
        var e = document.createElement("span");
        var t = document.createTextNode(s);
        e.appendChild(t);
        return e;
      }
      function text(s) {
        return document.createTextNode(s);
      }
      function contents(n, slotName) {
        var e = document.createElement("z");
        e.style.display = "contents";
        e.style.color = "blue";
        if (n) e.appendChild(n);
        if (slotName) e.setAttribute("slot", slotName);
        return e;
      }

      function run() {
        document.body.offsetHeight;

        shadow("host1").innerHTML = '<slot style="display:inline"></slot> c';
        shadow("host2").innerHTML = 'a <slot style="display:contents"></slot> c';
        shadow("host3").innerHTML = 'a <slot style="display:contents"></slot>';
        shadow("host4").innerHTML = '<slot style="display:contents"></slot>';
        shadow("host5").innerHTML = 'a <slot style="display:contents"></slot>';
        shadow("host6").innerHTML = '<z style="color:blue; display:contents"><slot style="display:inline"></slot></z> c';
        shadow("host7").innerHTML = 'a <slot style="display:contents"></slot> c';
        shadow("host8").innerHTML = 'a <z style="color:blue; display:contents"><slot style="display:contents"></z></slot>';
        shadow("host9").innerHTML = '<slot style="display:contents"></slot>';
        shadow("hostA").innerHTML = 'a <slot style="display:contents"></slot>';
        shadow("hostB").innerHTML = 'a <slot name="c" style="display:contents"></slot> <slot name="b" style="display:contents"></slot> B';
        shadow("hostC").innerHTML = 'A <slot name="c" style="display:contents"></slot> <slot name="b" style="display:contents"></slot> B';
        shadow("hostD").innerHTML = 'A <slot name="c" style="display:contents"></slot> <slot name="b" style="display:contents"></slot> B <slot name="b"></slot>';
        shadow("hostE").innerHTML = 'A <slot name="c" style="display:contents"></slot> <slot name="b" style="display:contents"></slot> B';
        shadow("hostF").innerHTML = '<slot name="c" style="display:contents"></slot> <slot name="b" style="display:contents"></slot> B';
        shadow("hostG").innerHTML = '<slot name="b" style="display:contents"></slot>';
        shadow("hostH").innerHTML = '<slot name="b" style="display:contents"></slot>';
        shadow("hostI").innerHTML = 'A<slot name="b" style="display:contents"></slot>';
        shadow("hostJ").innerHTML = 'A<slot name="b" style="display:contents"></slot>';
        shadow("hostK").innerHTML = '<slot name="b" style="display:contents"></slot>';
        shadow("hostL").innerHTML = '<slot name="b" style="display:contents"></slot>';
        shadow("hostM").innerHTML = '<slot name="b" style="display:contents"></slot><slot name="i" style="display:inline"></slot>';
        shadow("hostN").innerHTML = '<slot name="b" style="display:contents"></slot><slot name="i" style="display:inline"></slot>';
        shadow("hostO").innerHTML = '<slot name="b" style="display:contents"></slot><slot name="i" style="display:inline"></slot>';
        shadow("hostP").innerHTML = '<slot name="b" style="display:contents"></slot><slot name="i" style="display:inline"></slot>';
        shadow("hostQ").innerHTML = '<slot name="b" style="display:contents"></slot><slot name="i" style="display:inline"></slot>';
      }

      function tweak() {
        document.body.offsetHeight;

        host1.appendChild(span("1"));
        host2.appendChild(text("2"));
        host3.appendChild(span("3"));
        host4.appendChild(text("4"));

        var e = span("5");
        e.style.display = "contents";
        host5.appendChild(e);

        host6.appendChild(span("6"));
        host7.appendChild(contents(text("7")));
        host8.appendChild(contents(span("8")));
        host9.appendChild(contents(text("9")));

        var e = contents(span("A"));
        hostA.appendChild(e);

        var e = contents(text("2"), "b");
        hostB.appendChild(e);
        var e = contents(text("1"), "c");
        hostB.appendChild(e);

        var e = contents(text("2"), "b");
        e.className = "after";
        hostC.appendChild(e);
        var e = contents(text("1"), "c");
        e.className = "before";
        hostC.appendChild(e);

        var e = contents(text("2"), "b");
        e.className = "before after";
        hostD.appendChild(e);
        var e = contents(text(" 3"), "b");
        e.className = "before after";
        hostD.appendChild(e);
        var e = contents(text("1"), "c");
        e.className = "before";
        hostD.appendChild(e);

        var e = contents(contents(text("2")), "b");
        e.className = "before after";
        hostE.appendChild(e);
        var e2 = contents(text("1"), "c");
        e2.className = "before after";
        hostE.insertBefore(e2, e);

        var e = contents(text("2"), "b");
        e.className = "before after";
        hostF.appendChild(e);
        var e2 = contents(text("1"), "c");
        e2.className = "before after";
        hostF.insertBefore(e2, e);

        var e = contents(contents(text("1")), "b");
        hostG.appendChild(e);
        var e = contents(text("2"), "b");
        e.className = "before after";
        hostG.appendChild(e);

        var e = contents(contents(text("2")), "b");
        hostH.appendChild(e);
        var e2 = contents(text("1"), "b");
        e2.className = "before after";
        hostH.insertBefore(e2, e);

        var e = contents(text("b"), "b");
        hostI.appendChild(e);
        var e = span("c");
        e.setAttribute("slot", "b");
        hostI.appendChild(e);

        var e = contents(contents(text("b")), "b");
        hostJ.appendChild(e);
        var e = span("c");
        e.setAttribute("slot", "b");
        hostJ.appendChild(e);

        var inner = span("b");
        inner.className = "after";
        var e = contents(contents(inner), "b");
        hostK.appendChild(e);
        var e = span("d");
        e.setAttribute("slot", "b");
        hostK.appendChild(e);

        var inner = contents(null);
        inner.className = "before";
        var e = contents(inner, "b");
        hostL.appendChild(e);
        var e = span("b");
        e.setAttribute("slot", "b");
        hostL.appendChild(e);

        document.body.offsetHeight;
        setTimeout(function() {
            shadow("hostS");
            shadow("hostT");
            shadow("hostU");
            shadow("hostV").innerHTML = '<z style="color:green"><slot name="b"></slot></z>';

            document.body.offsetHeight;
            document.documentElement.removeAttribute("class");
          },0);
      }

      run();
      setTimeout(tweak, 0);
    </script>
  </body>
</html>
